package com.edu.exam.entity.examination.control;

import com.edu.exam.enums.examination.MonitoringConfigType;
import com.edu.exam.enums.examination.MonitoringConfigScope;
import com.edu.exam.enums.examination.MonitoringConfigStatus;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 监控配置实体类
 * 所属模块：E-01 考试执行模块
 * 对应数据库表：monitoring_config
 *
 * <p>监控配置实体用于管理安全监控的配置参数，包括监控规则、
 * 阈值设置、算法配置、策略配置等。支持监控配置的完整管理。</p>
 *
 * <p>核心功能：
 * - 规则配置：配置各类监控规则
 * - 阈值设置：设置监控指标的阈值
 * - 算法配置：配置检测算法参数
 * - 策略配置：配置监控策略和响应策略
 * - 配置版本：支持配置版本管理</p>
 *
 * @author System
 * @version 1.0.0
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class MonitoringConfig {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 配置ID
     *
     * <p>监控配置的唯一标识符，采用UUID格式生成。</p>
     */
    @Column(name = "config_id", nullable = false, length = 32, unique = true)
    private String configId;

    /**
     * 配置名称
     *
     * <p>监控配置的名称。</p>
     */
    @Column(name = "config_name", nullable = false, length = 100)
    private String configName;

    /**
     * 配置类型
     *
     * <p>配置的类型。
     * 支持的类型：RULE（规则）、THRESHOLD（阈值）、ALGORITHM（算法）、STRATEGY（策略）、SYSTEM（系统）等</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "config_type", nullable = false, length = 50)
    private MonitoringConfigType configType;

    /**
     * 配置范围
     *
     * <p>配置的应用范围。
     * 支持的范围：GLOBAL（全局）、MODULE（模块）、SESSION（会话）、USER（用户）、TASK（任务）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "config_scope", nullable = false, length = 20)
    private MonitoringConfigScope configScope;

    /**
     * 配置状态
     *
     * <p>配置的状态。
     * 支持的状态：ACTIVE（活跃）、INACTIVE（非活跃）、DRAFT（草稿）、DEPRECATED（已弃用）、DISABLED（禁用）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "config_status", nullable = false, length = 20)
    private MonitoringConfigStatus configStatus = MonitoringConfigStatus.DRAFT;

    /**
     * 配置内容
     *
     * <p>JSON格式的配置内容。</p>
     */
    @Column(name = "config_content", columnDefinition = "TEXT")
    private String configContent;

    /**
     * 配置参数
     *
     * <p>JSON格式的配置参数。</p>
     */
    @Column(name = "config_parameters", columnDefinition = "TEXT")
    private String configParameters;

    /**
     * 优先级
     *
     * <p>配置的优先级，数值越大优先级越高。</p>
     */
    @Column(name = "priority")
    private Integer priority = 0;

    /**
     * 生效时间
     *
     * <p>配置开始生效的时间。</p>
     */
    @Column(name = "effective_time")
    private LocalDateTime effectiveTime;

    /**
     * 失效时间
     *
     * <p>配置失效的时间。</p>
     */
    @Column(name = "expiry_time")
    private LocalDateTime expiryTime;

    /**
     * 版本号
     *
     * <p>配置的版本号。</p>
     */
    @Column(name = "config_version", nullable = false)
    private String configVersion = "1.0";

    /**
     * 父配置ID
     *
     * <p>父配置的ID，用于配置继承。</p>
     */
    @Column(name = "parent_config_id", length = 32)
    private String parentConfigId;

    /**
     * 配置模板ID
     *
     * <p>配置模板的ID。</p>
     */
    @Column(name = "template_id", length = 32)
    private String templateId;

    /**
     * 配置描述
     *
     * <p>配置的详细描述。</p>
     */
    @Column(name = "config_description", length = 500)
    private String configDescription;

    /**
     * 适用条件
     *
     * <p>配置适用的条件。</p>
     */
    @Column(name = "applicable_conditions", columnDefinition = "TEXT")
    private String applicableConditions;

    /**
     * 创建者ID
     *
     * <p>创建配置的操作者ID。</p>
     */
    @Column(name = "creator_id", nullable = false, length = 32)
    private String creatorId;

    /**
     * 审核者ID
     *
     * <p>审核配置的操作者ID。</p>
     */
    @Column(name = "reviewer_id", length = 32)
    private String reviewerId;

    /**
     * 审核时间
     *
     * <p>配置被审核的时间。</p>
     */
    @Column(name = "review_time")
    private LocalDateTime reviewTime;

    /**
     * 应用计数
     *
     * <p>配置被应用的次数。</p>
     */
    @Column(name = "application_count")
    private Integer applicationCount = 0;

    /**
     * 最后应用时间
     *
     * <p>配置最后被应用的时间。</p>
     */
    @Column(name = "last_applied_time")
    private LocalDateTime lastAppliedTime;

    /**
     * 性能指标
     *
     * <p>配置的性能指标。</p>
     */
    @Column(name = "performance_metrics", columnDefinition = "TEXT")
    private String performanceMetrics;

    /**
     * 配置标签
     *
     * <p>JSON格式的配置标签。</p>
     */
    @Column(name = "config_tags", columnDefinition = "TEXT")
    private String configTags;

    /**
     * 配置备注
     *
     * <p>配置的备注信息。</p>
     */
    @Column(name = "config_notes", columnDefinition = "TEXT")
    private String configNotes;

    /**
     * 是否默认配置
     *
     * <p>标记是否为默认配置。</p>
     */
    @Column(name = "is_default")
    private Boolean isDefault = false;

    /**
     * 是否只读
     *
     * <p>标记配置是否只读。</p>
     */
    @Column(name = "is_readonly")
    private Boolean isReadonly = false;

    /**
     * 验证规则
     *
     * <p>配置内容的验证规则。</p>
     */
    @Column(name = "validation_rules", columnDefinition = "TEXT")
    private String validationRules;

    /**
     * 变更历史
     *
     * <p>配置的变更历史记录。</p>
     */
    @Column(name = "change_history", columnDefinition = "TEXT")
    private String changeHistory;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 数据库版本号
     */
    @Column(name = "db_version", nullable = false)
    private Integer dbVersion = 1;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    
    // ===== 业务方法 =====
}